import { TOKENNAME, HTTP_REQUEST_URL, REQUEST_TIMEOUT, DEFAULT_LOGIN_PLATFORM } from '@/config/app.js';
import Cache from '@/utils/cache.js';
import { handleLogin } from '@/utils/login.js';

// 全局配置项
let globalConfig = {
  loginPlatform: DEFAULT_LOGIN_PLATFORM, // 默认登录平台
};

/**
 * 设置全局配置
 * @param {object} config - 全局配置项
 */
export const setGlobalConfig = (config) => {
  globalConfig = { ...globalConfig, ...config };
};

/**
 * 通用请求方法
 * @param {string} url - 请求地址
 * @param {string} method - 请求方法（GET/POST/PUT/DELETE）
 * @param {object} data - 请求参数
 * @param {object} options - 配置项
 * @param {boolean} options.requireAuth - 是否需要携带 Token
 * @param {boolean} options.showErrorToast - 是否显示错误提示
 * @param {function} options.onError - 错误回调函数
 * @param {string} options.redirectPath - 错误后跳转的页面路径
 * @param {string} options.loginPlatform - 登录平台（h5、wechat-mp、custom），覆盖全局配置
 * @returns {Promise} - 返回请求结果
 */
const request = async (url, method = 'GET', data = {}, options = {}) => {
  const {
    requireAuth = false,
    showErrorToast = true,
    onError,
    redirectPath,
    loginPlatform = globalConfig.loginPlatform, // 默认使用全局配置
  } = options;

  try {
    // 检查是否需要 Token
    if (requireAuth) {
      const token = Cache.get(TOKENNAME);
      if (!token) {
        await handleLogin(loginPlatform); // 触发登录逻辑
        throw new Error('未登录');
      }
    }

    // 设置请求头
    const headers = {
      'content-type': 'application/json',
      'version': 'Zh',
      'Cache-Control': 'no-cache',
    };
    if (requireAuth) {
      headers[TOKENNAME] = Cache.get(TOKENNAME);
    }

    // 发起请求
    const response = await uni.request({
      url: HTTP_REQUEST_URL + url,
      method,
      data,
      header: headers,
      timeout: REQUEST_TIMEOUT,
    });

    // 处理响应
    const { statusCode, data: resData } = response;
    if (statusCode === 200) {
      if (resData.code === 0 || resData.code === 200) {
        return resData; // 请求成功
      } else if (resData.code === 15002) {
        await handleLogin(loginPlatform); // Token 失效，触发登录逻辑
        throw new Error('登录失效');
      } else {
        throw new Error(resData.msg || resData.message || '系统错误');
      }
    } else {
      throw new Error('网络异常');
    }
  } catch (error) {
    console.error('请求失败:', error);

    // 显示错误提示
    if (showErrorToast) {
      uni.showToast({
        title: error.message || '网络超时',
        icon: 'none',
      });
    }

    // 错误回调
    if (onError) {
      onError(error);
    }

    // 跳转到指定页面
    if (redirectPath) {
      setTimeout(() => {
        uni.reLaunch({ url: redirectPath });
      }, 1500);
    }

    throw error;
  }
};

/**
 * GET 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求参数
 * @param {object} options - 配置项
 * @returns {Promise} - 返回请求结果
 */
export const get = (url, data = {}, options = {}) => {
  return request(url, 'GET', data, options);
};

/**
 * POST 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求参数
 * @param {object} options - 配置项
 * @returns {Promise} - 返回请求结果
 */
export const post = (url, data = {}, options = {}) => {
  return request(url, 'POST', data, options);
};

/**
 * PUT 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求参数
 * @param {object} options - 配置项
 * @returns {Promise} - 返回请求结果
 */
export const put = (url, data = {}, options = {}) => {
  return request(url, 'PUT', data, options);
};

/**
 * DELETE 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求参数
 * @param {object} options - 配置项
 * @returns {Promise} - 返回请求结果
 */
export const del = (url, data = {}, options = {}) => {
  return request(url, 'DELETE', data, options);
};